/**
 * @author: Gene
 * @age: 永远18岁的美少年
 * @Email： yangjianyun@58.com
 * @date: 2021-12-04 10:01:53
 * @description: ts 中的抽象类 抽象类是一个抽象的概念, 他 不能被实例化
 *
 *  1. 抽象类 和 抽象方法, 不包含具体实现, 必须在子类里面实现.
 *  2. 抽象方法,只能出现在抽象类里面,在子类里面实现
 *
 */
export {}

abstract class Animal {
    name: string

    abstract speak(): void
}

class Cat extends Animal {
    speak(): void {
        console.log(" --- 喵喵喵 ---");
    }
}

class Dog extends Animal {
    speak(): void {
        console.log(" --- wangwangwang ---");
    }
}

/**
 * ========= ================ 重写和重载 ========= ========
 * 重写 override      子类重写继承自父类的方法
 * 重载 overload       函数的重载, 一个函数有多个定义. 参数不一样
 */
// 函数重载, 必须声明在上面, 没有函数体大括号 {}
function double(val: number)
function double(val: string)

function double(val: any) {
    if (typeof val === "number") {
        return val * 2
    } else if (typeof val === "string") {
        return val + val
    }

}

/** =========== ===============  继承 和 多态 ====================*/
/**
 * 多态: => 同一个方法, 不同的子类有不同的实现
 */